#define _CRT_SECURE_NO_WARNINGS
//作者：爱吃糖的boy
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//qsort函数的模拟实现
void bubble_sort(int*p,int sz)
{
	for (int i = 0; i < sz-1; i++)
	{
		for (int j= 0;j< sz-i-1;j++) 
		{
			if (p[j] > p[j + 1])
			{
				int tmp = p[j];
				p[j] = p[j + 1];
				p[j + 1] = tmp;
			}
		}
	}
}
void print(int*p,int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ",p[i]);
	}

}
int com_int(const void*p1,void*p2)
{

	return *(int*)p1 - *(int*)p2;

}
void test2()
{
	int arr1[10] = { 1,3,5,7,9,2,4,6,8,0};
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	qsort(arr1,sz,sizeof(arr1[1]),com_int);
	//bubble_sort(arr1,sz);
	print(arr1,sz);
	return 0;

}
void Swap(char* p1,char* p2,int size)
{
	for (int i = 0; i < size; i++)
	{
		char tmp = *p1;
		*p1 = *p2;
		*p2 = tmp;
		p1++;
		p2++;
	}
}
struct Stu
{
	char name[20];
	int age;
};

int com_by_name(const void* p1, const void* p2)
{
	return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);

}
int com_by_age(const void* p1, const void* p2)
{
	return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;

}
void bubble_sort2(void* base,size_t sz,size_t size,int (*com)(const void*p1,const void*p2))
{
	for (int i = 0; i < sz - 1; i++)
	{
		for (int j = 0; j < sz - i - 1; j++)
		{
			if (com((char*)base+j*size, (char*)base +(j+1)*size)>0)
			{
				/*int tmp = p[j];
				p[j] = p[j + 1];
				p[j + 1] = tmp;*/
				Swap((char*)base + j * size, (char*)base + (j + 1) * size,size);
			}
		}
	}
}

void test3() //使⽤回调函数，模拟实现qsort（采⽤冒泡的⽅式）。
{
	int arr1[10] = { 1,3,5,7,9,2,4,6,8,0 };
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	bubble_sort2(arr1, sz, sizeof(arr1[0]), com_int);
	//bubble_sort(arr1,sz);
	print(arr1, sz);
	return 0;
}



void test4() 
{
	struct Stu arr[] = { {"ggg",99},{"zzz",23},{"ccc",67}};
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort2(arr, sz, sizeof(arr[0]), com_by_age);
	for (int i = 0; i < sz; i++)
	{
		printf("%s %d\n",arr[i].name,arr[i].age);
	}
}
//int main()
//{
//	test4();
//	return 0;
//
//}


// sizeof和strlen的对⽐
// sizeof计算变量所占内存内存空间⼤⼩的，单位是字节，如果操作数是类型的话，计算的是使⽤类型创建的变量所占内存空间的⼤⼩。
//int main()
//{
//	int a = 10;
//	printf("%d\n", sizeof(a));
//	printf("%d\n", sizeof a);
//	printf("%d\n", sizeof(int));
//	int arr[5] = {0};
//	char arr1[5] = {0};
//	printf("%d\n", sizeof(arr));
//	printf("%d\n", sizeof(arr1));
//	return 0;
//
//}

//strlen 是C语⾔库函数，功能是求字符串⻓度

//int main()
//{
//	char arr1[3] = { 'a', 'b', 'c' };
//	char arr2[] = "abc";
//	printf("%d\n", strlen(arr1));
//	printf("%d\n", strlen(arr2));
//
//	printf("%d\n", sizeof(arr1));
//	printf("%d\n", sizeof(arr1));
//	return 0;
//}

//int main()
//{
//	char arr[] = { 'a','b','c','d','e','f' };
//	printf("%d\n", strlen(arr));//随机值
//	printf("%d\n", sizeof(arr));//5   数组名，计算的是整个数组的大小
//	printf("%d\n", sizeof(arr + 0));//8   arr表示数组首元素的地址  计算的是地址的大小
//	printf("%d\n", sizeof(*arr));// 1   arr表示首元素的地址 //*arr表示首元素
//	printf("%d\n", sizeof(arr + 1));//8 arr首元素地址，计算的是第二个元素地址的大小
//	printf("%d\n", sizeof(arr[1]));//1      首元素
//	printf("%d\n", sizeof(&arr));//8   &arr   取出的是数组的地址，计算的是数组的地址
//	printf("%d\n", sizeof(*&arr));  //1、& 和* 抵消   2、%arr的类型是数组指针，*&arr就是对数组指针解引用访问一个数组的大小
//	printf("%d\n", sizeof(&arr + 1));//8    &arr+1是跳过整个数组后的一个地址
//	printf("%d\n", sizeof(&arr[0] + 1));//8     首元素地址+1====第二个元素的地址
//	return 0;
//}


//int main()
//{
//	int a[] = { 1,2,3,4 };
//	printf("%d\n", sizeof(a));  ///数组名，计算的是整个数组的大小
//	printf("%d\n", sizeof(a + 0));  //arr表示数组首元素的地址  计算的是地址的大小
//	printf("%d\n", sizeof(*a));// 1   arr表示首元素的地址 //*arr表示首元素
//	printf("%d\n", sizeof(a + 1));//8 arr首元素地址，计算的是第二个元素地址的大小
//	printf("%d\n", sizeof(a[1])); // 1      首元素
//	printf("%d\n", sizeof(&a));//8   &arr   取出的是数组的地址，计算的是数组的地址
//	printf("%d\n", sizeof(*&a));//1、& 和* 抵消   2、%arr的类型是数组指针，*&arr就是对数组指针解引用访问一个数组的大小
//	printf("%d\n", sizeof(&a + 1));//8    &arr+1是跳过整个数组后的一个地址
//	printf("%d\n", sizeof(&a[0]));//第一个元素的地址
//	printf("%d\n", sizeof(&a[0] + 1));//第二个元素的地址
//	return 0;
//
//}

//int main()
//{
//	/*strlen统计的是从 strlen 函数的参数 str 中这个地址开始向后， \0 之前字符串中字符的个数。
//		strlen 函数会⼀直向后找 \0 字符，直到找到为⽌，所以可能存在越界查找。*/
//	char arr[] = { 'a','b','c','d','e','f' };
//	printf("%d\n", strlen(arr));//随机值//arr首元素地址
//	printf("%d\n", strlen(arr + 0));//随机值////arr首元素地址
//	printf("%d\n", strlen(*arr));  //err
//	printf("%d\n", strlen(arr[1]));//err
//	printf("%d\n", strlen(&arr));//随机值
//	printf("%d\n", strlen(&arr + 1));//随机值
//	printf("%d\n", strlen(&arr[0] + 1));//随机值
//	return 0;
//
//}

